package com.junxian.demo02.service;

import com.junxian.demo02.dao.User;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
 * @Author: SunJunxian
 * @Date: 2018/12/11
 * @Description: Mapper
 */

@Mapper
public interface UserMapper {
    /**
     * 通过名字查询用户
     * @param name
     * @return Result<User>
     */
    @Select("select * from USER where NAME = #{name}")
    User findByName(@Param("name") String name);

    /**
     * 对于查询的结果往往就不再是简单的实体对象了，往往需要返回一个与数据库实体不同的包装类，
     * 那么对于这类情况，就可以通过@Results和@Result注解来进行绑定
     * @return
     */
    @Results({
            @Result(property = "name" ,column = "name"),
            @Result(property = "age" ,column = "age")
    })

    /**
     * 查找用户（列表）
     */
    @Select("select name , age from user")
    List<User> findAll();

    /**
     * 插入用户
     * @param name
     * @param age
     * @return Result<int>
     */
    @Insert("INSERT INTO USER(NAME , AGE) VALUES(#{name} , #{age})")
    int insert(@Param("name") String name , @Param("age") Integer age);

    /**
     * 通过Map对象传参来插入用户
     * @param map
     * @return Result<int>
     */
    @Insert("Insert into user(name , age) values(#{name , jdbcType=VARCHAR} , #{age , jdbcType=INTEGER})")
    int insertByMap(Map<String , Object> map);

    /**
     * 用User对象（普通的Java对象）来作为查询条件的传参
     * @param user
     * @return Result<int>
     */
    @Insert("Insert into user(name , age) values(#{name} , #{age})")
    int insertByUser(User user);

    /**
     * 更新用户
     * @param user
     */
    @Update("update user set age = #{age} where name = #{name}")
    void update(User user);

    /**
     * 删除用户
     * @param id
     */
    @Delete("delete from user where id = #{id}")
    void delete(Long id);
}
